package com.easystudy.config;

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
import org.springframework.security.oauth2.provider.token.RemoteTokenServices;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;

/**
 * @文件名称: OAuth2ClientConfig.java
 * @功能描述: 
 * @版权信息：  www.easystudy.com
 * @技术交流：  961179337(QQ群)
 * @编写作者：  lixx2048@163.com
 * @联系方式：  941415509(QQ)
 * @开发日期：  2020年8月1日
 * @历史版本： V1.0 
 * @备注信息：
 */
@Configuration
@EnableOAuth2Client
public class OAuth2ClientConfig {
	
	/**
	 * @功能描述: 创建token认证远程调用http模板
	 * @版权信息：  www.easystudy.com
	 * @编写作者：  lixx2048@163.com
	 * @开发日期：  2020年8月1日
	 * @备注信息：
	 */
	@Bean
	public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext context, OAuth2ProtectedResourceDetails details) {

		AuthorizationCodeAccessTokenProvider authCodeProvider = new AuthorizationCodeAccessTokenProvider();
		authCodeProvider.setStateMandatory(false);
		
		AccessTokenProviderChain provider = new AccessTokenProviderChain(Arrays.asList(authCodeProvider));
		
		OAuth2RestTemplate template = new OAuth2RestTemplate(details, context);
		template.setAccessTokenProvider(provider);
		
		return template;
	}

	/**
	 * @功能描述: 注册处理redirect uri的filter
	 * @版权信息：  www.easystudy.com
	 * @编写作者：  lixx2048@163.com
	 * @开发日期：  2020年8月1日
	 * @备注信息： 拦截redirectUri,根据授权服务器返回的授权码code获取token
	 */
	@Bean
	public OAuth2ClientAuthenticationProcessingFilter oauth2ClientAuthenticationProcessingFilter(
			OAuth2RestTemplate oauth2RestTemplate, RemoteTokenServices tokenService) {
		
		// 创建重定向URL过滤器
		OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter("/login");
		// 设置token远程调用接口
		filter.setTokenServices(tokenService);
		// 设置远程调用使用的模板
		filter.setRestTemplate(oauth2RestTemplate);
		// 设置回调成功的页面
		filter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler() {
			public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
					Authentication authentication) throws IOException, ServletException {
				// 认证成功之后返回的主页
				this.setDefaultTargetUrl("/home");
				super.onAuthenticationSuccess(request, response, authentication);
			}
		});
		return filter;
	}

	/**
	 * @功能描述: 注册token检查服务-从远程授权服务获取用户认证信息
	 * @版权信息：  www.easystudy.com
	 * @编写作者：  lixx2048@163.com
	 * @开发日期：  2020年8月1日
	 * @备注信息：
	 */
	@Bean
	@Primary
	public RemoteTokenServices tokenService(OAuth2ProtectedResourceDetails details) {
		RemoteTokenServices tokenService = new RemoteTokenServices();
		tokenService.setCheckTokenEndpointUrl("http://127.0.0.1:7000/oauth/check_token");
		tokenService.setClientId(details.getClientId());
		tokenService.setClientSecret(details.getClientSecret());
		return tokenService;
	}
	
//	/**
//	 * @功能描述: 授权客户端详情
//	 * @版权信息：  www.easystudy.com
//	 * @编写作者：  lixx2048@163.com
//	 * @开发日期：  2020年8月1日
//	 * @备注信息：
//	 */
//    @Bean 
//    @ConfigurationProperties("security.oauth2.client") 
//    public AuthorizationCodeResourceDetails google() { 
//    	return new AuthorizationCodeResourceDetails(); 
//    } 
//
//    /**
//     * @功能描述: 授权资源服务配置
//     * @版权信息：  www.easystudy.com
//     * @编写作者：  lixx2048@163.com
//     * @开发日期：  2020年8月1日
//     * @备注信息：
//     */
//    @Bean 
//    @ConfigurationProperties("security.oauth2.resource") 
//    public ResourceServerProperties googleResource() { 
//    	return new ResourceServerProperties(); 
//    } 
}